from threading import Thread, Lock, current_thread

from pip._internal.commands import lock

# 需求：根据下标在列表中取值, 保证同一时刻只能有一个线程去取值
lst = [1,8,4,7,2,6,5,9]

lock = Lock()

# 线程死锁和解决办法
# 取值方法
# 第一种解决死锁方法
# def get_value(index:int):
#     lock.acquire()
#     # 下标越界判断
#     if index >= len(lst):
#         print(f'下标越界了，当前线程是{current_thread()}')
#         lock.release() # 释放锁
#         return
#     value = lst[index]
#     print(f'当前线程:{current_thread()}取出来的值是:{value}')
#     lock.release()

# 第二种解决死锁方法。【建议使用第二种with语句解决死锁问题，不需要手动的调用lock.acquire争抢锁，lock.release释放锁】
def get_value(index:int):

    with lock:
        # 下标越界判断
        if index >= len(lst):
            print(f'下标越界了，当前线程是{current_thread()}')
            return
        value = lst[index]
        print(f'当前线程:{current_thread()}取出来的值是:{value}')


if __name__ == '__main__':

    # 模仿多线程
    for i in range(20):
        t = Thread(target=get_value, args=(i,))
        t.start()
